HTMLify

script.js
Views: 43 | Author: cody
import * as THREE from "three";
import { ParametricGeometry } from "three/addons/geometries/ParametricGeometry.js";
import { OrbitControls } from "three/addons/controls/OrbitControls.js";

console.clear();

var scene = new THREE.Scene();
scene.background = new THREE.Color("#151515");

var camera = new THREE.PerspectiveCamera(30, innerWidth / innerHeight);
camera.position.set(0, 0, 25);
camera.lookAt(scene.position);

var renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(innerWidth, innerHeight);
renderer.setAnimationLoop(animationLoop);
document.body.appendChild(renderer.domElement);

window.addEventListener("resize", (event) => {
    camera.aspect = innerWidth / innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(innerWidth, innerHeight);
});

var controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.autoRotate = true;

var ambientLight = new THREE.AmbientLight("white", 0.5);
scene.add(ambientLight);

var light = new THREE.DirectionalLight("white", 3);
light.position.set(1, 1, 1);
scene.add(light);

function surface(u, v, target) {
    const n = 10,
        t = 1.5;

    u *= 2 * Math.PI;
    v *= 2 * Math.PI;

    var r = (Math.cos(v) ** n + Math.sin(v) ** n) ** (-1 / n),
        x = (4 + r * Math.cos(v + t * u)) * Math.cos(u),
        y = (4 + r * Math.cos(v + t * u)) * Math.sin(u),
        z = r * Math.sin(v + t * u);

    target.set(x, y, z);
}

const geometry = new ParametricGeometry(surface, 100, 100);

var object = new THREE.Mesh(geometry, new THREE.MeshNormalMaterial());
scene.add(object);

function animationLoop(t) {
    object.rotation.z = t / 2700;

    controls.update();
    light.position.copy(camera.position);
    renderer.render(scene, camera);
}

Comments